package ddddd;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test2 {
    public static void main(String[] args) {
        //要代理的真实对象
        Class clazz= null;
        try {
            clazz = Class.forName("ddddd.Teacher");
            Object o = clazz.newInstance();

            //代理对象的调用处理程序，我们将要代理的真实对象传入代理对象的调用处理的构造函数中，最终代理对象的调用处理程序会调用真实对象的方法

            /**
             * 通过Proxy类的newProxyInstance方法创建代理对象，我们来看下方法中的参数
             * 第一个参数：people.getClass().getClassLoader()，使用handler对象的classloader对象来加载我们的代理对象
             * 第二个参数：people.getClass().getInterfaces()，这里为代理类提供的接口是真实对象实现的接口，这样代理对象就能像真实对象一
             * 样调用接口中的所有方法
             * 第三个参数：handler，我们将代理对象关联到上面的InvocationHandler对象上
             */
            People proxy = (People) Proxy.newProxyInstance(clazz.getClassLoader(),
                    o.getClass().getInterfaces(), new InvocationHandler() {
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            Object invoke = method.invoke(o, args);
                            return invoke;
                        }
                    }

            );
          String a=proxy.work();
            System.out.println(a);
          //  System.out.println(proxy.work());
        } catch (Exception e) {
            e.printStackTrace();
        }



    }
}
